#pragma once

//根据客户端做用户管理，并将message 转发给所有的在线用户
#include<vector>
#include"InetAddr.hpp"
#include"Logger.hpp"

class Route
{
private:
    bool IsExists(const InetAddr& addr)
    {
        //遍历数组查找是否有相同的便可
        for(auto& user : _online_user)
        {
            if(user == addr) return false;
        }
        return true;
    }
    void AddUser(const InetAddr& addr)
    {
        if(IsExists(addr)) _online_user.push_back(addr);
    }
    void SendMessageToAll( int sockfd ,std::string& message , InetAddr& addr)
    {
        //遍历数组做写入
        for(auto& user : _online_user)
        {
            //dbug
            LOG(LogLevel::DEBUG) << "route [" << message << "] to: " << user.ToString();
            //将消息做一下处理
            std::string info = addr.ToString();
            info += '#';
            info += message;

            sendto(sockfd,message.c_str() , message.size(),0 ,(struct sockaddr*)&user, sizeof(user));
        }
    }

    void DeleteUser(std::string& message , InetAddr& addr)
    {
        if(message == "Q!")
        {
            auto iter = _online_user.begin();
            for( ; iter != _online_user.end();iter++)
            {
                if(*iter == addr)
                {
                    _online_user.erase(iter);
                    break;//直接退出循环，避免迭代器失效的问题
                }
            }
        }
    }
public:
    Route()
    {}
    ~Route()
    {}

    //将消息转发给其他人
    void RouteMessageToAll(int sockfd ,  std::string& message , InetAddr &addr)
    {
        //将转发信息的人加入管理在线人数的数组中
        AddUser(addr);

        //将message 发送给所有在线的用户
        SendMessageToAll(sockfd ,message , addr);

        //如果用户要退出，此处定一个协议：Q! 表示退出
        DeleteUser(message ,addr);
    }


private:
    std::vector<InetAddr> _online_user;
};